Javaの配列、コレクション、Stream API
いろんなのがある
プリミティブな配列
int[], String[]など
java.util.Arrays にソートや検索などの便利系機能が入っている
コレクションフレームワーク
java.util.Collection interfaceを実装した組み込みクラス。
java.util.List 配列に似てるやつ。初期化時に値は設定できないので、配列を変換するのが楽。
ArrayList 配列ベース。サイズがありインデックス指定の取得・代入が得意。中間要素の追加が苦手。
LinkedList 数珠つなぎのやつ。サイズがなくインデックス指定は全走査となる。中間要素の追加は高速。
CopyOnWriteArrayList スレッドセーフなやつ。
Vector 互換性のために残された古いクラス。CopyOnWriteArrayListを使おう。
java.util.Set 重複がない集合。要素を取得する get メソッドを持たない。中身で HashMap を使ってる。
HashSet 順序性なし。
LinkedHashSet 順序性を持たせたもの。
TreeSet 値の大小でソートされたもの。値を範囲指定して部分集合を得られる。
Hashtable これも互換性のために残された古いクラス。
java.util.Map キーと値を扱うやつ=連想配列。
HashMap 順序性なし。キーのオブジェクトのhashCodeを使う。
LinkedHashMap 順序性あり。
TreeMap キーの値の大小でソートされ、効率的に探索できるもの。
java.util.Queue FIFO。
java.util.Deque 両端から使えるFIFO。
走査にはfor-each文を使う。
code:for.java
int[] numbers = {0,1,2,3,4,5,6,7};
for (int n : numbers) {
System.out.println(n);
}
Stream API + ラムダ式
Java SE 8から導入された新機能。
Collection.stream() でStreamオブジェクトを作り、中間操作を行い、配列や結果を取り出す。
ラムダ式の書式パターン
基本の形 (引数) -> {処理}
最も冗長な書き方
(Type t1, Type t2) -> { return Integer.compare(t1.getValue(), t2.getValue()); }
代入先の型で推論できる場合、引数の型は省略できる
(t1, t2) -> { return Integer.compare(t1.getValue(), t2.getValue()); }
引数が1つなら () を省略できる
t -> { return t1.getValue(); }
引数が0なら()だけ。
() -> { System.out.println("Lambda!"); }
中身の式が1つなら、returnと{}を省略できる。
(t1, t2) -> Integer.compare(t1.getValue(), t2.getValue())
既存のメソッドを::でラムダ式として参照する
System.out::println
this::メソッド名
instanceName::メソッド名